package com.xmg.p2p.base.service.impl;

import com.xmg.p2p.base.service.IVerifyCodeService;
import com.xmg.p2p.base.util.BidConst;
import com.xmg.p2p.base.util.DateUtil;
import com.xmg.p2p.base.util.UserContext;
import com.xmg.p2p.base.vo.VerifyCodeVO;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.UUID;

/**
 * @BelongsProject: jinrong-website
 * @BelongsPackage: com.xmg.p2p.base.service.impl
 * @author: Andy
 * @date: 2021.3.11 11:24
 * @Description: 验证码业务的子类
 * @since JDK 1.8
 */
@Service
public class IVerifyCodeServiceimpl implements IVerifyCodeService {
    public void sendVerifyCode(String phoneNumber) {
        // 判断当前是否能发送验证码
        // 手机号、验证码、发送时间
        // 首先从Session中获取封装的验证对象，
        //      如果对象存在，说明已经发送了。就不能再次频繁发送！
        //      如果对象不存在，应该发送验证码。
        VerifyCodeVO verifyCodeVO = UserContext.getVerifyCode();
        // 判断对象是否存在
        //     如果不存在，或者 上一次发送的时间已经超过60秒，那就进行重新的发送！
        if (verifyCodeVO == null ||
                DateUtil.getBetweenSecond(new Date(),verifyCodeVO.getSendTime())>60){
            // 正常发送验证码短信
            // 生成一个验证码
            String verifyCode = UUID.randomUUID().toString().substring(0, 4);
            // 向手机号发送验证码短信
            System.out.println("向手机号"+phoneNumber+"发送验证码:"+verifyCode);
            // 将这次发送的数据保存到验证对象中...
            verifyCodeVO = new VerifyCodeVO();
            verifyCodeVO.setCode(verifyCode);
            verifyCodeVO.setPhoneNumber(phoneNumber);
            verifyCodeVO.setSendTime(new Date());
            // 将封装好的对象放到Session中
            UserContext.putVerifyCode(verifyCodeVO);

        }else {
            // 提示
            throw new RuntimeException("发送过于频繁...");

        }
    }

    public boolean verify(String phoneNumber, String verifyCode) {
        // 首先要得到封装好的verifyCodeVO对象
        VerifyCodeVO VO = UserContext.getVerifyCode();
        // 判断手机号、验证码、有效期
        if (VO != null  // 发送验证码
                && VO.getPhoneNumber().equals(phoneNumber)    // 判断手机号是否一致
                && VO.getCode().equals(verifyCode)      // 判断验证码是否一致
                && DateUtil.getBetweenSecond(new Date(),VO.getSendTime())   // 现在的时间减去上次的时间，如果小于等于180秒
                        <= BidConst.VERIFYCODE_VALID_TIME){
            // 验证码有效期显示三分钟
            return true;
        }
        return false;
    }
}
